export function throttle(fn: Function, time: number) {
    let lastTime = Date.now();
    return function () {
        const newTime = Date.now();
        if (newTime - lastTime > time) {
            fn();           // fn需提前绑定 this
            lastTime = newTime;
        }
    }
}

export function debounce(fn: Function, time: number) {
    let timeout: any;
    return function () {
        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(() => {
            fn();           // fn需提前绑定 this
            timeout = null;
        }, time);
    }
}

// Part 1
// 1. 二维数组中的查找
// 在一个 n * m 的二维数组中，每一行都按照从左到右递增的顺序排序，每一列都按照从上到下递增的顺序排序。请完成一个高效的函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。
// [
//   [1,   4,  7, 11, 15],
//   [2,   5,  8, 12, 19],
//   [3,   6,  9, 16, 22],
//   [10, 13, 14, 17, 24],
//   [18, 21, 23, 26, 30]
// ]
// 2. 反转链表
// 定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
// /**
//  * Definition for singly-linked list.
//  * function ListNode(val) {
//  *     this.val = val;
//  *     this.next = null;
//  * }
//  */
// /**
//  * @param {ListNode} head
//  * @return {ListNode}
//  */
//  var reverseList = function(head) {
// };
// 3. 将数组 [[3, 2], [1, 1],[2,1],[1,2],[2,2],[3,1]] 排序为 [[1,2],[1,1],[2,2],[2,1],[3,2],[3,1]]
// Part 2
// 1. 实现截流或防抖函数
// 2. 实现对象的深拷贝
// 3. 实现jsonp